#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <time.h>
#include <unistd.h>
#include <sys/signal.h>
#define THREAD_ERROR_CHECK(ret, msg)                       \
    {                                                      \
        if (ret != 0)                                      \
        {                                                  \
            fprintf(stderr % s : % s, msg, strerror(ret)); \
        }                                                  \
    }
#define ARGS_CHECK(argc, num)               \
    {                                       \
        if (argc != num)                    \
        {                                   \
            fprintf(stderr, args error !n); \
            return -1;                      \
        }                                   \
    }
#define ERROR_CHECK(ret, num, msg) \
    {                              \
        if (ret == num)            \
        {                          \
            perror(msg);           \
            exit(1);               \
        }                          \
    }
typedef struct msgbuf
{
    long mtype;
    char mtext[64];
} MSBF;

void sigFun()
{
    printf("alarm\n");
}
int main(int argc, char *argv[])
{
    key_t key = ftok("msg_snd.c", 'm');
    int msgid = msgget(key, IPC_CREAT | 0664);
    ERROR_CHECK(-1, msgid, "mgget");
    MSBF msg1;
    MSBF msg2;
    MSBF msg3;
    int ret = msgrcv(msgid, &msg1, sizeof(msg1.mtext),1, 0);
    printf("%d\n", ret);

    ret = msgrcv(msgid, &msg2, sizeof(msg2.mtext), 2, 0);
    printf("%d\n", ret);

    ret = msgrcv(msgid, &msg3, sizeof(msg2.mtext), -1, 0);
    printf("%d\n", ret);

    printf("msg1:%ld\t %s\n", msg1.mtype, msg1.mtext);
    printf("msg2:%ld\t %s\n", msg2.mtype, msg2.mtext);
    printf("msg3:%ld\t %s\n", msg2.mtype, msg3.mtext);

    struct msqid_ds stat;
    msgctl(msgid, IPC_STAT, &stat);
    printf("%s", ctime(&stat.msg_ctime));
    printf("cuid =%d\n", stat.msg_perm.cuid);
    printf("cgid = %d\n", stat.msg_perm.cgid);
    signal(SIGALRM, sigFun);
    alarm(3);
    msgctl(msgid, IPC_RMID, NULL);
    return 0;
}
